package top.someapp.applib.kits;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

/**
 * class 帮助类
 *
 * @author zw-zheng
 * Created on 2019-07-19
 */
public final class ClassMate {

    private ClassMate() {
        // no need instance.
    }

    /**
     * 获取在clz上放置的泛型参数
     *
     * @param clz 放置了泛型参数的类
     * @param index 泛型参数的位置，从0开始
     * @return 在clz上放置的泛型参数
     */
    public static Class<?> typeParameter(Class<?> clz, int index) {
        Type type = clz.getGenericSuperclass();
        Type[] types = null;
        if (type instanceof ParameterizedType) {
            types = ((ParameterizedType) type).getActualTypeArguments();
        }
        if (types == null || types.length <= index) {
            return null;
        }
        return types[index] instanceof Class ? (Class<?>) types[index] : null;
    }

    /**
     * 测试 value 是否是 type 类型
     *
     * @param value 待测试的值
     * @param type 类型
     * @return true：是；false：不是
     */
    public static boolean is(Object value, Class<?> type) {
        if (value == null) {
            return !type.isPrimitive();
        }
        return isSubClassOf(value.getClass(), type);
    }

    /**
     * 测试 sub 是否是 parent 的子类
     *
     * @param sub 待测试的子类
     * @param parent 父类
     * @return true：是；false：不是
     */
    public static boolean isSubClassOf(Class<?> sub, Class<?> parent) {
        return parent != null && parent.isAssignableFrom(sub);
    }

    public static boolean isPrimitive(Class<?> type) {
        return type != null && type.isPrimitive();
    }

    public static boolean isNotPrimitive(Class<?> type) {
        return type != null && !type.isPrimitive();
    }
}
